Paradigmas da Programação I

ESI (5301P3) / MCC (7001N4)

18 de Fevereiro de 2000

Questão 1

Para armazenar a informação respeitante aos alunos de PP1 usamos o seguinte tipo:
data Alunos = Vazia | Nodo (Numero,Nome) Alunos Alunos
type Numero = Int
type Nome = String
Note que esta definição corresponde a uma árvore binária cujos elementos são do tipo (Numero,Nome).

Além disso vamos usar árvores de procura, i.e., árvores ordenadas pelo número do aluno.

Por exemplo, para guardar a informação referente aos alunos

1234 Xico
2345 Maria
3456 Manel
4567 Sara
Poder-se-ia usar a árvore da esquerda mas não a da direita

(3456,"Manel") (3456,"Manel") / \ / \ / \ / \ / \ / \ (1234,"Xico") (4657,"Sara) (2345,"Maria") (4657,"Sara") \ / \ / \ / (2345,"Maria") (1234,"Xico")


1.
Qual o termo (do tipo Alunos) que representa a árvore da esquerda?
2.
Defina uma função inscrito :: Alunos -> Numero -> Bool que teste se um aluno está inscrito em PP1.
3.
Defina uma função nome :: Alunos -> Numero -> Maybe Nome que determina o nome de um aluno (Nothing no caso de o aluno não estar inscrito).
4.
Defina a função lista :: Alunos -> [Nome] que calcule a lista dos nomes dos alunos (por ordem crescente do número).

Questão 2

Considere o seguinte tipo para representar linhas poligonais
type Ponto = (Float,Float)
type Poligonal = (Ponto, [Ponto]) -- (inicial, restantes)
type Delta = [(Float,Float)] -- (deltax, deltay)
Pretende-se definir uma função zoom :: Poligonal -> Float -> Poligonal que escale uma figura de um determinado factor (multiplicativo), mantendo o seu ponto inicial. Assim, por exemplo, ao escalarmos a linha poligonal
l = ((1,1),[(2,2),(2,4),(5,4)])
de um factor de 2, obtemos a linha poligonal
((1,1),[(3,3),(3,7),(9,7)])
1.
Comece por definir uma função delta :: Poligonal -> Delta que transforma os pontos de uma linha em deslocamentos relativos ao ponto anterior; no exemplo de cima
delta l = [(1,1),(0,2),(3,0)]
2.
Defina agora a função undeltas :: Ponto -> Delta -> Poligonal, inversa da anterior , i.e., a função que dado um ponto inicial e uma lista de deslocamentos relativos, calcula uma linha poligonal. Continuando no mesmo exemplo, undeltas (1,1) [(2,2),(0,4),(6,0)] deve dar como resultado
((1,1),[(3,3),(3,7),(9,7)])
3.
Defina uma função multiplica :: Float -> Delta -> Delta que, dado um factor e uma lista de deslocamentos, retorna a lista de deslocamentos multiplicados pelo factor.
4.
Use as funções anteriores para definir a função zoom referida acima.

Questão 3

Apresente, definições em HASKELL para responder às alíneas seguintes.
1.
Apresente uma definição recursiva e uma outra usando a função de ordem superior filter de uma função que, dados um carácter e uma palavra, determine o número de ocorrências desse carácter nessa palavra. Qual o tipo da função que definiu?
2.
Defina uma função que, dado um carácter e uma palavra, determine a posição onde esse carácter ocorre pela última vez na palavra.
3.
Defina uma função que, dadas duas palavras, verifique se uma delas está contida na outra; por exemplo, a palavra norma está contida na palavra anormal.

Questão 4

Complete a seguinte definição
data BTree a = Vazia | Nodo a (BTree a) (BTree a)
class Eq a where
  (==) :: a -> a -> Bool
instance (Eq a) => Eq (BTree a) where ...

Questão 5

Seja t definido por t = filter id [True,False,True] Indique o tipo e o valor de t. Explique por palavras suas o significado de t.

Questão 6

Suponha o seguinte tipo de dados que pretende armazenar uma sequência de transformações a aplicar a um elemento inicial (cada transformação é representada por uma função a aplicar ao elemento anterior):
data Trans a = T a [a->a]
Defina Trans a como uma instância da classe Show, de forma que que o resultado de
exemplo = T 0 [(+5),(*2)]
putStr (show exemplo)
seja
0 -> 5 -> 10


José Bernardo Barros
2000-02-18